package org.springblade.modules.admin.service.feishu.impl;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springblade.common.enums.FeiShuDocumentEnum;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.admin.dto.feishu.FeiShuCreateBatchDTO;
import org.springblade.modules.admin.dto.feishu.UpdateMaintenancePersonnelDTO;
import org.springblade.modules.admin.service.ElevatorService;
import org.springblade.modules.admin.service.feishu.IFeiShuDocumentService;
import org.springblade.modules.admin.service.feishu.IGovernmentElevatorPoolService;
import org.springblade.modules.admin.vo.feishu.GovernmentElevatorPoolVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @author: Sharry
 * @createTime: 2024-01-03 13:43
 * @version: Version-1.0
 */
@Service
public class GovernmentElevatorPoolServiceImpl implements IGovernmentElevatorPoolService {

	@Autowired
	private ElevatorService elevatorService;

	@Autowired
	private IFeiShuDocumentService feiShuDocumentService;

	@Override
	public String addByHand() {
		// 0. 更新流程：先列出全部记录，获取当前全部record_id 集合。现阶段先删除后新增，则完成更新
		// 1. 数据准备：目标文件夹Token、文档ID; 需要更新的数据列表
		// 1.1 目标文件夹Token、文档ID
		String appToken = FeiShuDocumentEnum.GOVERNMENT_ELEVATOR_POOL.getAppToken();
		String tableId = FeiShuDocumentEnum.GOVERNMENT_ELEVATOR_POOL.getTableId();
		// 1.2 需要更新的数据列表
		List<GovernmentElevatorPoolVO> governmentElevatorPoolVOList = elevatorService.queryGovernmentElevatorPoolVOList();
		// 2. 数据处理；数据封装
		// 2.1 数据处理
		governmentElevatorPoolVOList.forEach(g -> {
			// 2.1.1 数据根据状态进行处理
			Integer fromType = g.getFromType();
			Integer maintainStatus = g.getMaintainStatus();
			if(new Integer("1").equals(fromType)){
				g.setOutsourcingStatus("外包");
			}else if(new Integer("2").equals(fromType)){
				g.setOutsourcingStatus("非外包");
			}else{
				g.setOutsourcingStatus("数据缺失");
			}
			// switch case 语句, maintainStatus -1:无状态，1: 脱保，2: 在保（合同期内），3：在保（合同期外），4：在保（拟定保养）
			switch (maintainStatus){
				case -1:
					g.setInServiceStatus("无状态");
					break;
				case 1:
					g.setInServiceStatus("脱保");
					break;
				case 2:
					g.setInServiceStatus("在保（合同期内）");
					break;
				case 3:
					g.setInServiceStatus("在保（合同期外）");
					break;
				case 4:
					g.setInServiceStatus("在保（拟定保养）");
					break;
				default:
					g.setInServiceStatus("数据缺失");
					break;
			}
			// 2.1.2 计算日期
			String nextCheckTime = g.getNextCheckTime();
			// String 类型 的日期转换成 Date 类型
			Date nextCheckTimeDate = DateUtil.parse(nextCheckTime);
			// 计算从今天到目标日期的天数
			long days = DateUtil.betweenDay(new Date(), nextCheckTimeDate, false);
			g.setDaysToAnnualInspection(new Integer(String.valueOf(days)));
		});
		// 2.2 数据封装
		FeiShuCreateBatchDTO feiShuCreateBatchDTO = new FeiShuCreateBatchDTO();
		List<UpdateMaintenancePersonnelDTO> records = new ArrayList<>();
		for(GovernmentElevatorPoolVO u : governmentElevatorPoolVOList){
			UpdateMaintenancePersonnelDTO element = new UpdateMaintenancePersonnelDTO();
			Map<String,Object> elementMap = new HashMap<>(10);
			elementMap.put("设备注册代码", u.getDeviceCode());
			elementMap.put("设备名称", u.getDeviceType());
			elementMap.put("使用证编号", u.getUseNum());
			elementMap.put("单位内部编号", u.getPrivateNum());
			elementMap.put("使用单位", u.getBuildingUser());
			elementMap.put("出厂编号", u.getCompanyNum());
			elementMap.put("定期报告编号", u.getReportNum());
			String nextCheckTime = u.getNextCheckTime();
			// String 类型 的日期转换成 long 类型
			long nextCheckTimeLong = DateUtil.parse(nextCheckTime).getTime();
			elementMap.put("下次定期检验日期", nextCheckTimeLong);
			elementMap.put("使用状态", u.getUseStatus());
			elementMap.put("注册状态", u.getRegisterStatus());
			elementMap.put("所在地区", u.getLocation());
			elementMap.put("梯无忧-项目名称", u.getBuildingName());
			elementMap.put("梯无忧-梯号", u.getElevatorNum());
			elementMap.put("梯无忧-在保状态", u.getInServiceStatus());
			elementMap.put("梯无忧-外包情况", u.getOutsourcingStatus());
			elementMap.put("距离截止年审天数", u.getDaysToAnnualInspection());
			element.setFields(elementMap);
			records.add(element);
		}
		// records 去重
		Set<UpdateMaintenancePersonnelDTO> set = new HashSet<>(records);
		// 清空 records
		records.clear();
		// 将 set 中的数据添加到 records 中
		records.addAll(set);
		feiShuCreateBatchDTO.setRecords(records);

		// 3. 通过service方法删除文档内容
		List<JSONObject> jsonObjects = feiShuDocumentService.commandQueryBatch(appToken, tableId, null);
		// 获取查询列表的 所有 record_id
		List<String> r = new ArrayList<>();
		// 当 r的大小 大于 500 时，批量操作, 每次 499 条，直到 r 为空
		if(jsonObjects.size() >= 500){
			while (Func.isNotEmpty(jsonObjects)){
				for(int i = 0; i < 499 ; i++){
					// 当未越界时，添加到 r 中
					if(i < jsonObjects.size()){
						r.add(jsonObjects.get(i).getString("record_id"));
					}
				}
				FeiShuCreateBatchDTO deleteDTO = new FeiShuCreateBatchDTO();
				deleteDTO.setRecords(r);
				// 转义成 JSON 字符串
				String deleteBody = JSONObject.toJSONString(deleteDTO);
				feiShuDocumentService.commandDeleteBatch(appToken, tableId, deleteBody);
				// 清空 r
				r.clear();
				// 重新查询
				jsonObjects = feiShuDocumentService.commandQueryBatch(appToken, tableId, null);
			}
		}else{
			jsonObjects.forEach(j -> {
				r.add(j.getString("record_id"));
			});
			FeiShuCreateBatchDTO deleteDTO = new FeiShuCreateBatchDTO();
			deleteDTO.setRecords(r);
			// 转义成 JSON 字符串
			String deleteBody = JSONObject.toJSONString(deleteDTO);
			feiShuDocumentService.commandDeleteBatch(appToken, tableId, deleteBody);
		}
		// 4. 重新新增数据
		// 将 records 按照 每份最大 500 条进行分割
		List<UpdateMaintenancePersonnelDTO> tempRecords = new ArrayList<>();
		String result = null;
		// 当 recordsList 的大小 大于 500 时，批量操作, 每次 499 条，直到 recordsList 为空
		if(records.size() >= 500){
			// 计算分割次数
			int times = records.size() / 499;
			for(int i = 0; i < times-1; i++){
				List<UpdateMaintenancePersonnelDTO> subList = records.subList(i * 499, (i + 1) * 499);
				FeiShuCreateBatchDTO feiShuCreateBatchDTO1 = new FeiShuCreateBatchDTO();
				feiShuCreateBatchDTO1.setRecords(subList);
				// 转义成 JSON 字符串
				String jsonBody = JSONObject.toJSONString(feiShuCreateBatchDTO1);
				result = feiShuDocumentService.commandAddBatch(appToken, tableId, jsonBody);
			}
			// 处理最后一次
			List<UpdateMaintenancePersonnelDTO> subList = records.subList((times-1) * 499, records.size());
			FeiShuCreateBatchDTO feiShuCreateBatchDTO1 = new FeiShuCreateBatchDTO();
			feiShuCreateBatchDTO1.setRecords(subList);
			// 转义成 JSON 字符串
			String jsonBody = JSONObject.toJSONString(feiShuCreateBatchDTO1);
			result = feiShuDocumentService.commandAddBatch(appToken, tableId, jsonBody);
		}else {
			// 转义成 JSON 字符串
			String jsonBody = JSONObject.toJSONString(feiShuCreateBatchDTO);
			result = feiShuDocumentService.commandAddBatch(appToken, tableId, jsonBody);
		}
		// 5. 发送消息, 通知到群
		List<JSONObject> targetGroupObjects = feiShuDocumentService.commandQueryGroupsBatch();
		List<String> chatIds = new ArrayList<>();
		targetGroupObjects.forEach(t -> chatIds.add(t.getString("chat_id")));
		// 发送消息
		String finalResult = result;
		chatIds.forEach(c -> {
			// 组装数据
			JSONObject bodyJson = new JSONObject();
			bodyJson.put("receive_id", c);
			bodyJson.put("msg_type", "text");
			HashMap<String,String> contentMap = new HashMap<>(2);
			String message = "定时任务更新银河租户质检院电梯池表格信息，结果：" + finalResult;
			contentMap.put("text", message);
			// 将 contentMap 转换成 JSON 格式
			bodyJson.put("content", JSON.toJSONString(contentMap));
			feiShuDocumentService.commandSendGroupMessage(bodyJson.toJSONString());
		});
		return result;
	}
}
